package com.hc.programming.date;

/**
 * @author huangchao E-mail:fengquan8866@163.com
 * @version 创建时间：2024/7/31 11:54
 */
public class 计算日期在本年第几天 {

    public static void main(String[] args) {
        计算日期在本年第几天 t = new 计算日期在本年第几天();
        System.out.println(t.dayOfYear(2024, 2, 1));
        System.out.println(t.dayOfYear(2023, 1, 3));
        System.out.println(t.dayOfYear(2024, 3, 1));
        System.out.println(t.dayOfYear(2024, 3, 32));
        System.out.println(t.dayOfYear(2024, 2, 29));
        System.out.println(t.dayOfYear(2023, 2, 29));
        ;
    }

    /**
     * 计算给定年月日是该年的第几天。
     *
     * @param year  年份
     * @param month 月份（1-12）
     * @param day   日期（1-31，根据月份和年份而定）
     * @return 日期在当年第几天，无效输入返回-1
     */
    int dayOfYear(int year, int month, int day) {
        // 检查输入的有效性
        if (year < 1 || year > 9999 || month < 1 || month > 12 || day < 1 || day > 31) {
            return -1;
        }

        // 每个月的天数，非闰年
        int[] daysOfMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        // 如果是闰年，2月有29天
        if (isLeapYear(year)) {
            daysOfMonth[1] = 29;
        }

        // 校验日
        if (daysOfMonth[month-1] < day) {
            return -1;
        }

        // 累加前几个月的天数
        int totalDays = 0;
        for (int i = 0; i < month - 1; i++) {
            totalDays += daysOfMonth[i];
        }

        // 加上当前月份的天数
        totalDays += day;

        return totalDays;
    }

    /**
     * 判断给定年份是否为闰年。
     *
     * @param year 年份
     * @return 如果是闰年则返回true，否则返回false
     */
    private boolean isLeapYear(int year) {
        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
    }
}
